import axios, {  AxiosError, AxiosRequestConfig, AxiosResponse } from "axios";
import AxiosCanceler from "./axiosCancel";
import store from "@/store"
import { ElMessage } from "element-plus";
import loading from "@/utils/loading";
import { showFailToast } from "vant/lib/toast";
import { dingdingLinkOpen } from "@/utils";

interface ResultData {
  data: AnyObject;
  code?: string | number;
  msg?: string;
}

const axiosCanceler = new AxiosCanceler();
export function request(config: AnyObject): Promise<ResultData> {
  const instance = axios.create({
    baseURL: '',
    timeout: 10000
  });

  instance.interceptors.request.use(
    (config: AxiosRequestConfig) => {
      axiosCanceler.addPending(config);
      config.headers!.Authorization = `Bearer ${store.state.dingdingInfo.token}`;

      return config;
    },
    (error: AxiosError) => {
      return Promise.reject(error);
    }
  );
  instance.interceptors.response.use(
    (response: AxiosResponse) => {
      axiosCanceler.removePending(config);
      const { data, status } = response;

      // * 在请求结束后，并关闭请求 loading
      // tryHideFullScreenLoading();
      if (data.code == 401 || data.code == 10006) {
        showFailToast(data.message);
        dingdingLinkOpen();

      } else if (data.code !== 0 && status != 200) {
        loading.hide();
        showFailToast(data.message);
        return Promise.reject(data);
      } else {
        return data
      }

      return response;

      // * 登陆失效（code == 401）
      // if (data.code == ResultEnum.OVERDUE) {
      //   ElMessage.error(data.msg);
      //   router.replace(LOGIN_URL);
      //   return Promise.reject(data);
      // }
      // // * 全局错误信息拦截（防止下载文件得时候返回数据流，没有code，直接报错）
      // if (data.code && data.code !== ResultEnum.SUCCESS && data.code !== 200) {
      //   ElMessage.error(data.message);
      //   return Promise.reject(data);
      // }
      // * 成功请求（在页面上除非特殊情况，否则不用处理失败逻辑）
    },
    async (error: AxiosError) => {
      const { response } = error;
      // tryHideFullScreenLoading();
      // 请求超时单独判断，因为请求超时没有 response
      loading.hide();

      if (!error.message) return;
      if (error.message?.indexOf("timeout") !== -1) ElMessage.error("请求超时！请您稍后重试");
      if (error.response!.status == 401) {
        dingdingLinkOpen();
      } else {
        showFailToast(error.response?.data.message);
      }


      // 根据响应的错误状态码，做不同的处理
      // if (response) checkStatus(response.status);
      // 服务器结果都没有返回(可能服务器错误可能客户端断网)，断网处理:可以跳转到断网页面
      // if (!window.navigator.onLine) router.replace("/500");
      return Promise.reject(error);
    }
  );


  return instance(config);
}
